// #include"Socket.hpp"
// #include<iostream>
// #include<memory>
#include"Tcpserver.hpp"
#include<string>
#include"Protocol.hpp"
#include"Netcal.hpp"
#include"Daemon.hpp"
// using namespace SocketMoudle;
void Usage(std::string usege){
    std::cout<<"Usage: "<<usege<<" port"<<std::endl;
}
int main(int argc, char* argv[]){
    // std::unique_ptr<Socket> sockp=std::unique_ptr<TcpSocket>();
    // sockp->BuildListenSocket();
    // std::unique_ptr<Socket> sockp2=std::unique_ptr<UdpSocket>();
    // sockp2->BuildListenSocket();
    if(argc!=2){
        Usage(argv[0]);
        exit(1);
    }
    //守护进程化
    LOG(LogLevel::INFO)<<"服务器已经启动，已经是一个守护进程了";
    Daemon();
    //Enable_Console_Log;//开启屏幕日志
    Enable_File_Log;//开启文件日志
    //系统函数
    //daemon(nochdir,noclose);//noclose表示不关闭文件描述符nochdir表示是否更改工作路径
    //1.顶层
    std::unique_ptr<Cal> cal=std::make_unique<Cal>();
    //2.协议层
    std::unique_ptr<Protocol> proto=std::make_unique<Protocol>([&cal](const Request& req)->Response{
        return cal->Execute(req);
    });
    //3.网络层
    std::unique_ptr<TcpServer> server=std::make_unique<TcpServer>(std::stoi(argv[1]),[&proto,&cal]
    (std::shared_ptr<Socket>&sock,NetAddr&client){
        //处理请求
        proto->GetRequest(sock,client);
    });
    server->Start();
    sleep(100);
    server->Stop();
    return 0;
}